/*
    ## Miscellaneous
*/
import DICT from "./address_dict.ts";
const misc: any = {
  // Dice
  d4: function () {
    return this.natural(1, 4);
  },
  d6: function () {
    return this.natural(1, 6);
  },
  d8: function () {
    return this.natural(1, 8);
  },
  d12: function () {
    return this.natural(1, 12);
  },
  d20: function () {
    return this.natural(1, 20);
  },
  d100: function () {
    return this.natural(1, 100);
  },
  /*
	    随机生成一个 GUID。

	    http://www.broofa.com/2008/09/javascript-uuid-function/
	    [UUID 规范](http://www.ietf.org/rfc/rfc4122.txt)
	        UUIDs (Universally Unique IDentifier)
	        GUIDs (Globally Unique IDentifier)
	        The formal definition of the UUID string representation is provided by the following ABNF [7]:
	            UUID                   = time-low "-" time-mid "-"
	                                   time-high-and-version "-"
	                                   clock-seq-and-reserved
	                                   clock-seq-low "-" node
	            time-low               = 4hexOctet
	            time-mid               = 2hexOctet
	            time-high-and-version  = 2hexOctet
	            clock-seq-and-reserved = hexOctet
	            clock-seq-low          = hexOctet
	            node                   = 6hexOctet
	            hexOctet               = hexDigit hexDigit
	            hexDigit =
	                "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9" /
	                "a" / "b" / "c" / "d" / "e" / "f" /
	                "A" / "B" / "C" / "D" / "E" / "F"

	    https://github.com/victorquinn/chancejs/blob/develop/chance.ts#L1349
	*/
  guid: function () {
    var pool = "abcdefABCDEF1234567890",
      guid = this.string(pool, 8) + "-" +
        this.string(pool, 4) + "-" +
        this.string(pool, 4) + "-" +
        this.string(pool, 4) + "-" +
        this.string(pool, 12);
    return guid;
  },
  uuid: function () {
    return this.guid();
  },
  /*
	    随机生成一个 18 位身份证。

	    [身份证](http://baike.baidu.com/view/1697.htm#4)
	        地址码 6 + 出生日期码 8 + 顺序码 3 + 校验码 1
	    [《中华人民共和国行政区划代码》国家标准(GB/T2260)](http://zhidao.baidu.com/question/1954561.html)
	*/
  id: function () {
    var id,
      sum = 0,
      rank = [
        "7",
        "9",
        "10",
        "5",
        "8",
        "4",
        "2",
        "1",
        "6",
        "3",
        "7",
        "9",
        "10",
        "5",
        "8",
        "4",
        "2",
      ],
      last = [
        "1",
        "0",
        "X",
        "9",
        "8",
        "7",
        "6",
        "5",
        "4",
        "3",
        "2",
      ];

    id = this.pick(DICT).id +
      this.date("yyyyMMdd") +
      this.string("number", 3);

    for (var i = 0; i < id.length; i++) {
      // @ts-ignore
      sum += id[i] * rank[i];
    }
    id += last[sum % 11];

    return id;
  },

  /*
	    生成一个全局的自增整数。
	    类似自增主键（auto increment primary key）。
	*/
  increment: function () {
    var key = 0;
    return function (step: number) {
      return key += (+step || 1); // step?
    };
  }(),
  inc: function (step: number) {
    return this.increment(step);
  },
};

export default misc;
